﻿using System;
using System.Collections.Generic;
using System.Reflection;
using System.Windows.Forms;
using System.Data;
using System.Collections;

namespace QL_Truong_Hoc.HocTap
{
    public partial class frmTongKet : DevExpress.XtraEditors.XtraForm
    {
        private const string mcstrRoleCode = "tong_ket";

        private int mintLopID = clsConst.gcintNoneValue;
        private int mintTrinhDo = clsConst.gcintNoneValue;
        private int mintNghe = clsConst.gcintNoneValue;
        //private int mintHsID = clsConst.gcintNoneValue;
        private int mintKDT = clsConst.gcintNoneValue;
        private List<DTO.MKhungDaoTaoMonDTO> mlstKdtMon = null;
        private Hashtable mtblHashTinhTK;
        private Hashtable mtblHashHeSoMon;

        public frmTongKet()
        {
            InitializeComponent();
        }

        private void frmHocSinhLop_Load(object sender, EventArgs e)
        {
            if (!clsCommon.fncCheckRole(Program.glstRoles, mcstrRoleCode))
            {
                this.BeginInvoke(new MethodInvoker(this.Close));
                return;
            }

            // TODO: This line of code loads data into the 'qLTHDataSet.mNghe' table. You can move, or remove it, as needed.
            this.mNgheTableAdapter.Fill(this.qLTHDataSet.mNghe);
            // TODO: This line of code loads data into the 'qLTHDataSet.mKhoaHoc' table. You can move, or remove it, as needed.
            this.mKhoaHocTableAdapter.Fill(this.qLTHDataSet.mKhoaHoc);
            // TODO: This line of code loads data into the 'qLTHDataSet.mKhoa' table. You can move, or remove it, as needed.
            this.mKhoaTableAdapter.Fill(this.qLTHDataSet.mKhoa);
            // TODO: This line of code loads data into the 'qLTHDataSet.mTrinhDoDaoTao' table. You can move, or remove it, as needed.
            this.mTrinhDoDaoTaoTableAdapter.Fill(this.qLTHDataSet.mTrinhDoDaoTao);
            // TODO: This line of code loads data into the 'qLTHDataSet.mLopSelectAllWithDetail' table. You can move, or remove it, as needed.
            this.mLopSelectAllWithDetailTableAdapter.Fill(this.qLTHDataSet.mLopSelectAllWithDetail);

            mtblHashTinhTK = new Hashtable();
            mtblHashHeSoMon = new Hashtable();
        }

        private void grdControlDsLop_MouseDoubleClick(object sender, MouseEventArgs e)
        {
            try
            {
                Cursor.Current = Cursors.WaitCursor;
                DataTable tblData = null;

                //chỉ kích hoạt với chuột trái
                if (e.Button != System.Windows.Forms.MouseButtons.Left) return;

                mintLopID = clsCommon.fncCnvNullToInt(dgvDsLop.GetFocusedRowCellValue(colLop_ID));

                if (mintLopID <= 0)
                { return; }

                //lấy các thông tin liên quan
                mintKDT = clsCommon.fncCnvNullToInt(dgvDsLop.GetFocusedRowCellValue(colKDT_ID));
                mintTrinhDo = clsCommon.fncCnvNullToInt(dgvDsLop.GetFocusedRowCellValue(colTD_ID));
                mintNghe = clsCommon.fncCnvNullToInt(dgvDsLop.GetFocusedRowCellValue(colNG_ID));

                //lấy số môn cần phải học, lưu xem môn nào cần tính điểm tổng kết
                mlstKdtMon = DAO.MKhungDaoTaoMonDAO.SelectWhere(Program.gobjDb, string.Format("KDT_ID = {0}", mintKDT));
                mtblHashTinhTK.Clear();
                mtblHashHeSoMon.Clear();
                for (int i = 0; i <= mlstKdtMon.Count - 1; i++)
                {
                    mtblHashTinhTK.Add(mlstKdtMon[i].MO_ID, mlstKdtMon[i].TinhDiemTongKet);
                    mtblHashHeSoMon.Add(mlstKdtMon[i].MO_ID, mlstKdtMon[i].HeSoMon);
                }

                if (mintTrinhDo == (int)clsEnum.TRINH_DO_DAO_TAO.SO_CAP)
                {
                    grdControlSC.Visible = true;
                    grdControlSC.Dock = DockStyle.Fill;
                    grdControlCD.Visible = false;
                    grdControlTC.Visible = false;

                    tblData = DAO.clsDbAccess.fncGetTongKetSC(Program.gobjDb, mintKDT, mintLopID);
                    grdControlSC.DataSource = tblData;

                    //format các cột. chỉ cho phép sửa cột điểm rèn luyện.
                    for (int i = 0; i <= dgvTongKetSC.Columns.Count - 1; i++)
                    {
                        if (dgvTongKetSC.Columns[i].FieldName == "Điểm rèn luyện") continue;
                        if (dgvTongKetSC.Columns[i].FieldName == "HS_ID") dgvTongKetSC.Columns[i].Visible = false;
                        dgvTongKetSC.Columns[i].OptionsColumn.AllowEdit = false;

                        if (dgvTongKetSC.Columns[i].FieldName == "Ngày sinh")
                        {
                            dgvTongKetSC.Columns[i].DisplayFormat.FormatType = DevExpress.Utils.FormatType.DateTime;
                            dgvTongKetSC.Columns[i].DisplayFormat.FormatString = "dd/MM/yyyy";
                            continue;
                        }

                        if (i >= 8 || dgvTongKetSC.Columns[i].FieldName == "Điểm đánh giá tốt nghiệp")
                        {
                            dgvTongKetSC.Columns[i].DisplayFormat.FormatType = DevExpress.Utils.FormatType.Numeric;
                            dgvTongKetSC.Columns[i].DisplayFormat.FormatString = "#.#";
                        }
                    }
                }
                else if (mintTrinhDo == (int)clsEnum.TRINH_DO_DAO_TAO.TRUNG_CAP)
                {

                    grdControlTC.Visible = true;
                    grdControlTC.Dock = DockStyle.Fill;
                    grdControlSC.Visible = false;
                    grdControlCD.Visible = false;

                    tblData = DAO.clsDbAccess.fncGetTongKetTC(Program.gobjDb, mintKDT, mintLopID);
                    grdControlTC.DataSource = tblData;

                    //format các cột. chỉ cho phép sửa cột điểm rèn luyện.
                    for (int i = 0; i <= dgvTongKetTC.Columns.Count - 1; i++)
                    {
                        if (dgvTongKetTC.Columns[i].FieldName == "Điểm rèn luyện") continue;
                        if (dgvTongKetTC.Columns[i].FieldName == "HS_ID") dgvTongKetTC.Columns[i].Visible = false;
                        dgvTongKetTC.Columns[i].OptionsColumn.AllowEdit = false;

                        if (dgvTongKetTC.Columns[i].FieldName == "Ngày sinh")
                        {
                            dgvTongKetTC.Columns[i].DisplayFormat.FormatType = DevExpress.Utils.FormatType.DateTime;
                            dgvTongKetTC.Columns[i].DisplayFormat.FormatString = "dd/MM/yyyy";
                            continue;
                        }

                        dgvTongKetTC.Columns[i].DisplayFormat.FormatType = DevExpress.Utils.FormatType.Numeric;
                        dgvTongKetTC.Columns[i].DisplayFormat.FormatString = "#.#";
                    }
                }
                else
                {
                    grdControlCD.Visible = true;
                    grdControlCD.Dock = DockStyle.Fill;
                    grdControlSC.Visible = false;
                    grdControlTC.Visible = false;

                    tblData = DAO.clsDbAccess.fncGetTongKetCD(Program.gobjDb, mintKDT, mintLopID);
                    grdControlCD.DataSource = tblData;

                    //format các cột. chỉ cho phép sửa cột điểm rèn luyện.
                    for (int i = 0; i <= dgvTongKetCD.Columns.Count - 1; i++)
                    {
                        if (dgvTongKetCD.Columns[i].FieldName == "Điểm rèn luyện") continue;
                        if (dgvTongKetCD.Columns[i].FieldName == "HS_ID") dgvTongKetCD.Columns[i].Visible = false;
                        dgvTongKetCD.Columns[i].OptionsColumn.AllowEdit = false;

                        if (dgvTongKetCD.Columns[i].FieldName == "Ngày sinh")
                        {
                            dgvTongKetCD.Columns[i].DisplayFormat.FormatType = DevExpress.Utils.FormatType.DateTime;
                            dgvTongKetCD.Columns[i].DisplayFormat.FormatString = "dd/MM/yyyy";
                            continue;
                        }

                        dgvTongKetCD.Columns[i].DisplayFormat.FormatType = DevExpress.Utils.FormatType.Numeric;
                        dgvTongKetCD.Columns[i].DisplayFormat.FormatString = "#.#";
                    }
                }
            }
            catch (Exception ex) { clsCommon.fncMsgError(MethodBase.GetCurrentMethod().ReflectedType.Name, MethodBase.GetCurrentMethod().Name, ex.Message); }
            finally { Cursor.Current = Cursors.Default; }
        }

        private void btnTinhTongKet_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e)
        {
            try
            {
                Cursor.Current = Cursors.WaitCursor;

                int intHsID;
                int intSoMon;
                float fltTong;
                float fltKTKT;
                float fltTbToanKhoas;
                float fltDiemLyThuyet;
                float fltDiemThucHanh;
                float fltDiemXepLoai;
                float fltRenLuyen;
                List<DTO.THocSinhMonDTO> lstHsMon;

                if (mintTrinhDo == (int)clsEnum.TRINH_DO_DAO_TAO.SO_CAP)
                {
                    #region So Cap

                    for (int i = 0; i <= dgvTongKetSC.RowCount - 1; i++)
                    {
                        intHsID = clsCommon.fncCnvNullToInt(dgvTongKetSC.GetRowCellValue(i, dgvTongKetSC.Columns["HS_ID"]));
                        fltKTKT = clsCommon.fncCnvNullToFloat(dgvTongKetSC.GetRowCellValue(i, dgvTongKetSC.Columns["Điểm KTKT"]));
                        fltRenLuyen = clsCommon.fncCnvNullToFloat(dgvTongKetSC.GetRowCellValue(i, dgvTongKetSC.Columns["Điểm rèn luyện"]));
                        intSoMon = 0;
                        fltTong = 0.0F;

                        //tính tổng điểm các môn.
                        lstHsMon = DAO.THocSinhMonDAO.SelectWhere(Program.gobjDb, string.Format("HS_ID = {0}", intHsID));
                        for (int j = 0; j <= lstHsMon.Count - 1; j++)
                        {
                            //chuyển tiếp nếu môn này không được tính vào điểm tổng kết
                            if (!(bool)mtblHashTinhTK[lstHsMon[j].MO_ID]) continue;

                            //nếu hs ko học môn này cũng chuyển tiếp
                            if (!lstHsMon[j].HSM_hoc) continue;

                            //ok! cộng vào tổng, tăng biến đếm số môn học.
                            fltTong += lstHsMon[j].HSM_diemtongket;
                            intSoMon++;
                        }

                        //tinsh điểm xếp loại.
                        fltDiemXepLoai = (fltTong + 2 * fltKTKT) / (intSoMon + 2);

                        //ghi lên grid
                        dgvTongKetSC.SetRowCellValue(i, dgvTongKetSC.Columns["Điểm đánh giá tốt nghiệp"], fltDiemXepLoai);
                        dgvTongKetSC.SetRowCellValue(i, dgvTongKetSC.Columns["Xếp loại tốt nghiệp"], clsCommon.fncGetXepLoai(fltDiemXepLoai));
                        dgvTongKetSC.SetRowCellValue(i, dgvTongKetSC.Columns["Xếp loại rèn luyện"], clsCommon.fncGetXepLoai(fltRenLuyen / 10));
                    }
                    #endregion
                }
                else
                {
                    #region Cao Dang - Trung Cap
                    DevExpress.XtraGrid.Views.Grid.GridView objGrid;

                    if (mintTrinhDo == (int)clsEnum.TRINH_DO_DAO_TAO.TRUNG_CAP) objGrid = dgvTongKetTC;
                    else objGrid = dgvTongKetCD;

                    for (int i = 0; i <= objGrid.RowCount - 1; i++)
                    {
                        intHsID = clsCommon.fncCnvNullToInt(objGrid.GetRowCellValue(i, objGrid.Columns["HS_ID"]));
                        fltRenLuyen = clsCommon.fncCnvNullToFloat(objGrid.GetRowCellValue(i, objGrid.Columns["Điểm rèn luyện"]));
                        fltDiemLyThuyet = clsCommon.fncCnvNullToFloat(objGrid.GetRowCellValue(i, objGrid.Columns["Thi Lý thuyết"]));
                        fltDiemThucHanh = clsCommon.fncCnvNullToFloat(objGrid.GetRowCellValue(i, objGrid.Columns["Thi Thực hành"]));
                        intSoMon = 0;
                        fltTong = 0.0F;

                        //tính tổng điểm các môn.
                        lstHsMon = DAO.THocSinhMonDAO.SelectWhere(Program.gobjDb, string.Format("HS_ID = {0}", intHsID));
                        for (int j = 0; j <= lstHsMon.Count - 1; j++)
                        {
                            //chuyển tiếp nếu môn này không được tính vào điểm tổng kết
                            if (!(bool)mtblHashTinhTK[lstHsMon[j].MO_ID]) continue;

                            //nếu hs ko học môn này cũng chuyển tiếp
                            if (!lstHsMon[j].HSM_hoc) continue;

                            //ok! cộng vào tổng, tăng biến đếm số môn học.
                            fltTong += lstHsMon[j].HSM_diemtongket * (int)mtblHashHeSoMon[lstHsMon[j].MO_ID];
                            intSoMon += (int)mtblHashHeSoMon[lstHsMon[j].MO_ID];
                        }

                        //tinsh điểm xếp loại.
                        fltTbToanKhoas = fltTong / (float)intSoMon;
                        fltDiemXepLoai = (3 * fltTbToanKhoas + 2 * fltDiemThucHanh + fltDiemLyThuyet) / 6;

                        //ghi lên grid
                        objGrid.SetRowCellValue(i, objGrid.Columns["Điểm TB toàn khóa"], fltTbToanKhoas);
                        objGrid.SetRowCellValue(i, objGrid.Columns["Điểm đánh giá tốt nghiệp"], fltDiemXepLoai);
                        objGrid.SetRowCellValue(i, objGrid.Columns["Xếp loại tốt nghiệp"], clsCommon.fncGetXepLoai(fltDiemXepLoai));
                        objGrid.SetRowCellValue(i, objGrid.Columns["Xếp loại rèn luyện"], clsCommon.fncGetXepLoai(fltRenLuyen / 10));
                    }
                    #endregion
                }
            }
            catch (Exception ex) { clsCommon.fncMsgError(MethodBase.GetCurrentMethod().ReflectedType.Name, MethodBase.GetCurrentMethod().Name, ex.Message); }
            finally { Cursor.Current = Cursors.Default; }
        }
        
    }
}